package scala.day03

object Demo07Match {
  def main(args: Array[String]): Unit = {
    /**
      * java中的模式匹配可以匹配基本数据类型、字符串、枚举
      *
      * scala中的模式匹配可以匹配基本数据类型、字符串、枚举、匹配对象、匹配类型
      *
      * 按照顺序匹配，只会匹配成功一个
      * 如果前面没有匹配成功就会走下划线
      */
    /**
      * 1.匹配基本数据类型
      */
    val i = 100
    i match {
      case 1 => println("i等于1")

      case 100 => println("i等于100")

        //如果前面没有匹配成功就匹配下划线
      case _ =>println("默认")
    }

    /**
      * 2.匹配字符串
      */
    val stu = "java"


    stu match{
      case "java"=>println("java")
      case "scala"=>println("scala")
      case _ =>println("其他")
    }

    /**
      * 3.匹配对象
      */
    case class User(id:String,name:String)

    val user: User = User("001","张三")

    user match{
      case User("001","张三") =>println("张三")
      case User("002","李四") =>println("李四")
      case _ =>println("其他")
    }

    /**
      * 4.匹配类型
      */
    val j: Any = 100.1
    j match{
        //这里的i,代表的是上面的j,执行的类型自动的转换
      case i: Int => println("int类型" +i)
      case s:String =>println("String类型"+s)
      case _ =>println("其他类型"+j)
    }

    /**
      * 匹配成功可以有返回值
      */
    val k = 100
    val r: Int = k % 2 match {
      //匹配成功之后返回
      case 1 => k+1
      case 0 => k*2
    }
    println(r)
    //用if写
    var s = 0
    if(k % 2 == 1){
      s = k+1
    }else {
      s = k * 2
    }
    println(s)

    /**
      * 模式匹配的应用
      *
      */
    val map = Map("001" -> "张三","002" -> "李四")
    val name: String = map.getOrElse("001","默认值")

    /**
      * Option：由两个取值，some None
      * some代表有值
      * Node代表没有值
      */
    val option: Option[String] = map.get("003")
    val value: String = option match {
        //如果没有值返回默认值
      case None => "默认值"
        //如果有返回对应的值
      case Some(x) =>x
    }
    val list: List[(String, Int)] = List(("001",23),("002",24),("003",25))
    list.map(f =>{
      val id: String = f._1
      val age: Int = f._2
      (id,age+1)
    })

    /**
      * 用case代替lambda表达式
      *
      * 需要将小括号替换成大括号
      */
    val list1: List[(String, Int)] = list.map{
      //匹配集合中的数据是否满足指定类型
      case(id:String,age:Int) =>{
        (id,age+1)
      }
    }
    list1.foreach(println)
  }
}
